package com.transaction.utils;

import java.net.URLEncoder;
import java.security.PrivateKey;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;

public class NKUtil {
	/**
	 * 
	 * @Title:getNKParam
	 * @Description:组装红包下发接口请求参数
	 * @param: map
	 * @param:
	 * @author:kyn
	 * @time 2018年7月26日 下午3:23:36
	 * @return String
	 * @throws
	 */
	public static String getNKParam(Map<String,Object> map){
    	String param="";
		try {
			//1.将参数进行排序
		    ArrayList<String> list = new ArrayList<String>();
	        for(Map.Entry<String,Object> entry:map.entrySet()){
	            if(entry.getValue() !="" && entry.getValue() != null && !("".equals(entry.getValue()))){
	                list.add(entry.getKey() + "=" + entry.getValue() + "&");
	            }
	        }
	        int size = list.size();
	        String [] arrayToSort = list.toArray(new String[size]);
	        Arrays.sort(arrayToSort, String.CASE_INSENSITIVE_ORDER);
	        StringBuilder sb = new StringBuilder();
	        for(int i = 0; i < size; i ++) {
	            sb.append(arrayToSort[i]);
	        }
	        String str=StringUtil.sortOrginReqStr(sb.toString());
	        System.out.println("第一步   参数排序之后的值:"+str);
	        //2.参数排序之后进行UTF-8编码
	        str = URLEncoder.encode(str,"UTF-8");
			System.out.println("第二步   编码过后的值："+str);
			//3.将编码的结果进行MD5加密
			str = MD5Util.MD5Encode(str);
			System.out.println("第三步  MD5加密之后的值 : "+str);
			//4.加密后的结果通过私钥进行加密
			PrivateKey privateK=RSAUtils.getSkPrivateKey();
			String rsaPrivateK= RSAUtils.sign(str.getBytes(), privateK);
			System.out.println("第四步  加密后结果通过私钥进行加密后的值: "+rsaPrivateK);
			//5.通过私钥加密后的值进行encoding编码得到sign
			String sign=URLEncoder.encode(rsaPrivateK, "UTF-8");
			System.out.println("第五步  最后得到的sign值 : "+sign);
			//在所有参数后面加上sign得到请求参数  param
			param=sb.append("sign="+sign).toString();
			System.out.println("最终组装完成的参数值: "+param);
		} catch (Exception e) {
			e.printStackTrace();
		}
        return param;
    }
}
